package com.rgs.base.core.file.storage;

import java.io.InputStream;
import java.time.LocalDate;

/**
 * @author Ren Gaoshuai
 * @ClassName FileStorageService
 * @Description 文件服务器业务接口
 * @date 2022-01-26 9:40
 **/
public interface FileStorageService {
    /**
     * 注：注意区分fileName，这里的fileName是处理过的名称格式UUID.suffix,并不是xxx.suffix文件名
     * fileUrl指的是一个URL地址，可以通过这个地址直接获取文件。
     */

    /**
     * 初始化路径
     */
    void initPath();

    /**
     * 清理路径
     */
    void clear();

    /**
     * 通过 输入流文件 保存对象
     *
     * @param inputStream 文件流对象
     * @param fileName    文件名称
     */
    void saveForInputStream(InputStream inputStream, String fileName);

    /**
     * 通过 直接数组 保存对象
     *
     * @param bytes    文件字节数组
     * @param fileName 文件名称
     */
    void saveForByte(byte[] bytes, String fileName);

    /**
     * 通过文件名删除
     *
     * @param fileName 文件名
     */
    void delete(String fileName);

    /**
     * 文件是否存在
     *
     * @param fileName 文件名
     * @return 结果
     */
    boolean exist(String fileName);

    /**
     * 复制文件
     *
     * @param fileName 源文件名
     * @return 赋值出来的文件的文件名
     */
    String copy(String fileName);

    /**
     * 根据文件类型后缀获取文件唯一文件名
     *
     * @param suffix 后缀
     * @return 文件名
     */
    String generateFileName(String suffix);

    /**
     * 获取文件地址
     *
     * @param fileName 文件名
     * @return 文件地址
     */
    String fileUrl(String fileName);

    /**
     * 获取文件地址
     *
     * @param fileName  文件名
     * @param aliasName 文件别名
     * @return 文件地址
     */
    String fileUrl(String fileName, String aliasName);

    /**
     * 获取文件地址
     *
     * @param fileName  文件名
     * @param aliasName 文件别名
     * @param localDate 日期
     * @return 文件地址
     */
    String fileUrl(String fileName, String aliasName, LocalDate localDate);

    /**
     * 获取文件，数组格式
     *
     * @param fileName 文件名
     * @return 字节数组格式文件
     */
    byte[] obtainFileForBytes(String fileName);

    /**
     * 获取文件，Base64格式
     *
     * @param fileName 文件名
     * @return Base64格式文件
     */
    String obtainFileForBase64(String fileName);

    /**
     * 获取文件，InputStream流格式
     *
     * @param fileName 文件名
     * @return InputStream流文件
     */
    InputStream obtainFileForInputStream(String fileName);
}
